﻿using System;
// object类（System.Object）是所有类型的最终基类。任何类型都可以向上转换成object类型。
// 为了说明这个类型的重要性，首先介绍通用栈。栈是一个遵循LIFO（Last-In First-Out，后进先出法）的数据结构。
// 栈有两种操作：push表示一个元素进栈和pop表示一个元素出栈。
// 下面是能容纳10个对象的栈的简单实现：
namespace _042_object类型
{
    public class Stack
    {
        int position;
        object[] data = new object[10];
        public void Push(object obj)
        {
            data[position++] = obj;
        }
        public object Pop()
        {
            return data[--position];
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 因为栈操作的对象是object类，所以可以实现任意类型的对象实例的进栈和出栈：
            Stack stack = new Stack();
            stack.Push("sausage");
            string s = (string)stack.Pop(); // 向下类型转换，需要显式转换
            Console.WriteLine(s);
            /* 承载了类的优点，object是引用类型。尽管如此，int等数值类型也可以和object类型相互转换，并加入栈中。C#的这个特性称为类型一致化，代码演示如下 */
            stack.Push(3);
            int three = (int)stack.Pop();
            /* 当数值类型和object类型之间相互转换时，公共运行时（CLR）必须做一些特定的工作，实现数值类型和引用类型的转换这个过程被称为装箱和拆箱。 */
            Console.ReadKey();
        }
    }
}
